Jak spocitat pocet pracovnich dnu v mesici.

Otázka od: David Michal

17. 10. 2002 12:06

Zdravim,
Nemate nekdo hotovou funkci na %subj. ?
Neco jako: PocetPracovnichDni := CountOFWorkDays('rijen', 2002);
S tim ze tabulku svatku a volnych dni mam nekde v nejake datove tabulce.
Diky,
David
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.401 / Virus Database: 226 - Release Date: 09/10/2002

Odpovedá: Lebeda David

17. 10. 2002 13:54

> Zdravim,
> Nemate nekdo hotovou funkci na %subj. ?

Ahoj,

pouzivam tuhle trojici, pozadavana fce je posledni z nich a pouziva tu
prostredni a ta
zas pouziva tu prvni.


function TDM.Velikonoce(Rok: Word): TDateTime;
var
 Ve_A, Ve_B, Ve_C, Ve_K, Ve_P, Ve_Q,Ve_F, Ve_G,Ve_D, Ve_E : LongInt;
 d, m: word;
begin
 Ve_A:=Rok mod 19;
 Ve_B:=Rok mod 4;
 Ve_C:=Rok mod 7;
 Ve_K:=Trunc(Rok/100);
 Ve_P:=Trunc(((8 * Ve_K) + 13)/25);
 Ve_Q:=Trunc(Ve_K/4);
 Ve_F:=(15 - Ve_P + Ve_K - Ve_Q) mod 30;
 Ve_G:=(4 + Ve_K - Ve_Q) mod 7;
 Ve_D:=((19 * Ve_A) + Ve_F) mod 30;
 Ve_E:=((2 * Ve_B) + (4 * Ve_C) + (6 * Ve_D) + Ve_G) mod 7;
 if (Ve_D + Ve_E) <= 9 then
 begin
  d := 22 + Ve_D + Ve_E;
  m := 3;
 end
 else
 begin
  d := Ve_D + Ve_E - 9;
  m := 4;
 end;
 if (Ve_D = 29) and (Ve_E = 6) then
  d := 19;
 if (Ve_D = 28) and (Ve_E = 6) and (Ve_A > 10) then
  d := 18;
 result := EncodeDate(Rok, m, d) + 1;
end;

function TDM.JePracovni(dt: TDateTime): Boolean;
var
 vRok, vMesic, vDen: word;
 Rok, Mesic, Den: word;
begin
 DecodeDate(dt, Rok, Mesic, Den);
 DecodeDate(Velikonoce(rok), vRok, vMesic, vDen);
 result := not ((DayOfWeek(dt) in [1, 7]) or
      ((den = 1) and (mesic in [1, 5])) or
      ((mesic = 7) and (den in [5, 6])) or
      ((den = 8) and (mesic = 5)) or
      ((den = 28) and (mesic in [9, 10])) or
      ((den = 17) and (mesic = 11)) or
      ((den = vDen) and (mesic = vMesic)) or
      ((mesic = 12) and (den in [24, 25, 26])));
end;

function PocetPracDnu(mesic, rok: word): integer;
var
 dt, konec: TDateTime;
begin
 result := 0;
 if mesic = 12 then
  konec := Int(EncodeDate(rok + 1, 1, 1))
 else
  konec := Int(EncodeDate(rok, mesic + 1, 1));
 dt := EncodeDate(rok, mesic, 1);
 while dt < konec do
 begin
  if JePracovni(dt) then
   inc(result);
  dt := dt + 1;
 end;
end;

David Lebeda

Odpovedá: Petr Jansky

18. 10. 2002 5:37

Ja neco podobneho delam takto:

V cyklu testuju kazdy den, jestli to neni SO ani NE a jestli neexistuje v
tabulce svatku.
Asi takhle nejak:

function CountOFWorkDays(Mes,Rok : word): word;
var
  I, J : word
begin
  Result := 0;
  for I := 1 to DaysInAMonth(Rok,Mes) do
  begin
    J := DayOfWeek(EncodeDate(Rok,Mes,I));
    if ((J > 1) and (J < 7)) and
"datum: Rok,Mes,I neexisuje v
tabulce svatek " then
inc(Result);
  end;


> Zdravim,
> Nemate nekdo hotovou funkci na %subj. ?
> Neco jako: PocetPracovnichDni := CountOFWorkDays('rijen', 2002);
> S tim ze tabulku svatku a volnych dni mam nekde v nejake datove tabulce.
> Diky,
> David



---
Odchozí zpráva mozná neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.401 / Virová báze: 226 - datum vydání: 9.10.2002